[アップデート] CloudFormation テンプレートで Cogntio ユーザープールに登場した機能プラン(Tier)が指定可能になりました。既存テンプレートをそのまま使う場合は注意しましょう

[アップデート] CloudFormation テンプレートで Cogntio ユーザープールに登場した機能プラン(Tier)が指定可能になりました。既存テンプレートをそのまま使う場合は注意しましょう

Clock Icon2024.12.12

いわさです。

先月のことですが、Amazon Cognito に Tier や新機能の導入など、かなり大型のアップデートがありました。

https://dev.classmethod.jp/articles/amazon-cognito-user-pools-feature-tiers/

https://dev.classmethod.jp/articles/amazon-cognito-managed-login/

https://dev.classmethod.jp/articles/cognito-with-passkey/

アップデート後の注意点として、利用者側としては特に「機能プラン」の概念を意識しておく必要があります。
アップデート前相当のプランも存在するのですが、デフォルトだと中間のプランが選択され、無意識のうちに利用料金が高くなる可能性があるためです。

https://dev.classmethod.jp/articles/new-feature-tiers-cognito/

CloudFormation でも機能プランが指定可能になりました

そんな中、数日前のアップデートで密かに CloudFormation の Cognito ユーザープールリソースでもようやく機能プランの概念が追加されたようです。

E04C89F0-F566-4645-9153-8E395BC825FA_4_5005_c.jpeg

既存の CloudFormation では勿論新しい属性を指定していないと思いますが、指定していない場合のデフォルト挙動が気になるところ。
結論から言うとデフォルトは「エッセンシャル」という中間プランです。

そのため Cognito ユーザープールを含む既存の CloudFormation テンプレートを使い回す場合、意図せず従来よりも高額なプランが設定されてしまう可能性があるので注意が必要です。
挙動を確認してみましたので紹介します。

指定なしのデプロイ

今回追加された属性はこちらのドキュメントに記載されています。

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-userpooltier

LITEESSENTIALSPLUSが指定可能なのはマネジメントコンソールのとおりです。気をつけなければいけないのが以下の記述。

Defaults to ESSENTIALS.

もう既に答えが書いてあるのですが、デフォルトつまり省略時はエッセンシャルプランが設定されます。
では、まずは最小限でAWS::Cognito::UserPoolをデプロイしてみますか。

AWSTemplateFormatVersion: 2010-09-09
Resources:
  CognitoUserPool:
    Type: AWS::Cognito::UserPool
    Properties:
      UserPoolName: hoge1212userpool

リソースを確認してみると、ドキュメントに記載のとおり機能プランはエッセンシャルですね。

84FB4CEA-1EA7-47B2-853A-0A0263AF14F1.png

従来相当であればライトプランが設定されてほしいところだと思います。
アップデート前から Cognito ユーザープールを CloudFormation で管理していたという方は、この新しい挙動に気をつける必要があります。
機能的に何か出来なくなるわけではないのですが、意図せずユーザー単価が高くなる可能性があります。

ライトプランを指定してみる

デフォルトのエッセンシャルプランを回避するためには、当然ですがプランを明示的に指定すれば良いです。
従来ミニマムでユーザープールを使っていた方はこちらの設定を忘れないようにしましょう。

AWSTemplateFormatVersion: 2010-09-09
Resources:
  CognitoUserPool:
    Type: AWS::Cognito::UserPool
    Properties:
      UserPoolName: hoge1212userpool
      UserPoolTier: LITE

ライトプランが設定されました。

5BF9BFDE-3C54-4AE1-B788-5A51444221F4.png

逆に旧高度なセキュリティ機能を使う場合だと自動で安いプランに

Cognito 機能プランの導入で最も恩恵を受けることが出来るのは従来の高度なセキュリティ機能を使っていた方です。
実は CloudFormation 上の挙動も既に変わっていました。

AdvancedSecurityModeAUDITを指定しました。
これで以前であれば高度なセキュリティ機能が有効化され、ユーザー単価は約 10 倍です。

AWSTemplateFormatVersion: 2010-09-09
Resources:
  CognitoUserPool:
    Type: AWS::Cognito::UserPool
    Properties:
      UserPoolName: hoge1212userpool
      UserPoolAddOns:
        AdvancedSecurityMode: AUDIT

こちらをデプロイした結果が以下です。

7C06DFAA-3375-47C1-B7EB-A65D15EB1E18.png

「ライト + 高度なセキュリティ」プランではなく、より安価で高機能な「プラス」プランが自動で指定されていますね。
こちらは逆に意識せずに安いプランに自動で切り替わる形となりそうです。
ただし、既存ユーザープールの更新時についてはデフォルトプラン値が適用されないのでその点は気を付けてください。マネジメントコンソールから手動でプラスプランに切り替えたほうが良いと思います。

マネージドログインなどのエッセンシャル以上の機能を使っていた場合

今回のアップデートで併せてマネージドログインについても CloudFormation で設定出来るようになっています。
ただ、こちらはデフォルトではクラシック Hosted UI が設定されるので明示的な指定が必要です。

AWSTemplateFormatVersion: 2010-09-09
Resources:
  CognitoUserPool:
    Type: AWS::Cognito::UserPool
    Properties:
      UserPoolName: hoge1212userpool
  CognitoUserPoolDomain:
    Type: AWS::Cognito::UserPoolDomain
    Properties:
      Domain: hoge1212userpool
      UserPoolId: !Ref CognitoUserPool

つまり上記の場合だと以下のようにクラシックが設定されます。

3D8C5036-2C52-4921-A63F-2ABEE3C3F5EB.png

なので、明示的にManagedLoginVersionという新しいプロパティを指定しましょう。
省略時のデフォルトは1でクラシック Hosted UI が設定されます。2がマネージドログインです。

AWSTemplateFormatVersion: 2010-09-09
Resources:
  CognitoUserPool:
    Type: AWS::Cognito::UserPool
    Properties:
      UserPoolName: hoge1212userpool
  CognitoUserPoolDomain:
    Type: AWS::Cognito::UserPoolDomain
    Properties:
      Domain: hoge1212userpool
      UserPoolId: !Ref CognitoUserPool
      ManagedLoginVersion: 2

設定されました。

E779CFB0-BCB5-4ABC-B999-40FA2088BC31.png

なお、マネージドログインなどのエッセンシャル以上で利用可能な機能を使っている場合、プランのダウングレードを行おうとすると次のようなエラーが発生します。
ライトプランに切り替えたい場合はいくつか機能をオフにしてから切り替えるようにしましょう。

% rain deploy template.yaml hoge1212userpool
CloudFormation will make the following changes:
Stack hoge1212userpool:
  - AWS::Cognito::UserPoolDomain CognitoUserPoolDomain
  > AWS::Cognito::UserPool CognitoUserPool
Do you wish to continue? (Y/n)
Deploying template 'template.yaml' as stack 'hoge1212userpool' in ap-northeast-1.
Stack hoge1212userpool: UPDATE_ROLLBACK_COMPLETE
Messages:
  - CognitoUserPool - ap-northeast-1_VHpRW0rkV: Resource handler returned message: "The following features need to be disabled for the LITE pricing tier configured: Managed Login Version 2 (Service: CognitoIdentityProvider, Status Code: 400, Request ID: 81166c37-08dc-4beb-b9d4-4060a88190f5)" (RequestToken: 79449295-b6ae-552a-f100-784965f85416, HandlerErrorCode: InvalidRequest)
failed deploying stack 'hoge1212userpool'

さいごに

本日は CloudFormation テンプレートで Cogntio ユーザープールに登場した機能プラン(Tier)が指定可能になったので試してみました。
料金の観点で既存テンプレートをそのまま使う場合は注意が必要です。無意識のうちにアップデート前よりも高額なプランが使われている場合があります。

誤解のないように一点だけ、Cognito ユーザープールの機能プラン導入は個人的にはとても良いなと思ってます。
従来の高度なセキュリティ機能は高すぎたのでそれを単純に安く出来るケースがほとんどですし、高度な機能の一部のみを使いたいケース(アクセストークンのカスタマイズとか)が非常に多かったのですがちょうど良い使いやすいプランが登場したと思ってます。

ただ、最低限のユーザープール機能を使っていた方もいるはずで、それらの方々が意図せず料金が上がってしまうのは良くないと思います。
現状は利用者側で必要に応じて明示的にライトプランを指定するしかないので、そこだけ気をつけましょう。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.